//
//  HMOauthViewModel.swift
//  WeiBo
//
//  Created by apple on 16/6/24.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit
/*
    MVVM的原则:
    1. View和ViewController 结合在了一起
    2. View和ViewController 不能直接和Model进行交互,需要和ViewModel进行交互
    3. ViewModel对上需要和View和Controller交互,对下需要和Model交互

    ViewModel都放那些东西呢?
    1. 和Model打交道
    2. 所有的网络请求需要放在这里
    3. 对数据的处理

*/
class HMOauthViewModel: NSObject {

    
    // 定义成一个单例对象,方便外界调用,同时返回的数据是指向同一块内存区域
    static let shareInstance: HMOauthViewModel =  HMOauthViewModel()
    
    // 可能会有一个Model
    
    // 第一个网络请求的时候, 给 model赋值
    // 第二次读取model的时候,应该读取它的解档方法
    var userModel: HMUserModel?
    
    //  我们把是否登录的逻辑,放在ViewModel里
    var isLogin: Bool {
    
        return userModel?.access_token == nil ? false : true
        
    }
    
    // 直接把 userModel的 access_token 放在在ViewModel,方便用户调用
    var access_token: String? {
        return userModel?.access_token
    }
    
    // 在初始化方法里,给 userModel 赋值
   private override init() {
//        HMUserModel(dict: nil).readUserModel()
//        userModel = HMUserModel().readUserModel()
        userModel = HMUserModel.readUserModel()
        // super.init 默认会调用
        super.init()
    }
    
    func loadToken(code: String,success: ()->(),failed: ()->()){
        
        // 我们在这里发送一个请求
        /*
        必选	类型及范围	说明
        client_id	true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        grant_type	true	string	请求的类型，填写authorization_code
        
        grant_type为authorization_code时
        必选	类型及范围	说明
        code	true	string	调用authorize获得的code值。
        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
        */
        // 注意: 字典的key值同学们一定要复制
        let params = ["client_id":AppKey,
            "client_secret":AppSecret,
            "grant_type":"authorization_code",
            "code":code,
            "redirect_uri":AppRedirectURL
        ]
        
        /*
        status code: 404 -- 网址错误,到不到
        status code: 405
        */
        
        HMHTTPClient.request(.POST, URLString: "https://api.weibo.com/oauth2/access_token", parameters: params, success: { (JSON) -> Void in
            printLog(JSON)
            
            /*
            Optional({
            "access_token" = "2.00TB2V3GBuav5Bbc6155a1f6h85dhD";
            "expires_in" = 157679999;
            "remind_in" = 157679999;
            uid = 5829345367;
            })
            */
            
            // 问题: AnyObject? 不能放在字典里
            // 解决思路: 对 AnyObject? 进行转换
            guard let jsonDict = JSON as? [String: AnyObject] else {
                return
            }
            // 字典转模型
            let model = HMUserModel(dict: jsonDict)
            
            printLog(model.access_token)
            
            // 获取一下用户信息
            // 闭包里调用方法,需要用 self.
            //            self.loadUserInfo(model)
            self.loadUserInfo(model, infoSuccess: success, infoFailed: failed)
            
            }) { (error) -> Void in
                printLog(error)
                // 处理一下, 我们调用 闭包进行回调
                failed()
                
                
        }
        
    }
    
    private func loadUserInfo(model: HMUserModel,infoSuccess: ()->(),infoFailed: ()->()){
        
        /*
        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        uid	false	int64	需要查询的用户ID。
        */
        
        guard let access_token = model.access_token,uid = model.uid else {
            return
        }
        
        // let parems: [String : String?]
        // 字典里需要填 非可选 类型
        let parems = ["access_token": access_token,
            "uid":uid
        ]
        
        HMHTTPClient.request(.GET, URLString: "https://api.weibo.com/2/users/show.json", parameters: parems, success: { (JSON) -> Void in
            
            printLog(JSON)
            // 就 2个属性
            // 针对于比较少的属性,可以归类
            
            // 我们需要把 JSON 转换成字典
            guard let jsonDict = JSON as? [String: AnyObject] else {
                return
            }
            
            // 获取用户的昵称
            let name = jsonDict["screen_name"] as? String
            model.screen_name = name
            // 获取用户的头像的url
            model.profile_image_url = jsonDict["profile_image_url"] as? String
            
            printLog(model.profile_image_url)
            
            // 当网络请求成功之后, model就有值了,
            // 这个赋值方法是不是只会走一次,而且是授权成功之后,走了就不会再走了
            self.userModel = model
            
            // 调用归档方法
            model.saveUserModel()
            
            // 归档完成之后,就预示着我们的深度调用方法完成
            infoSuccess()
            
            }) { (error) -> Void in
                printLog(error)
                // 失败
                infoFailed()
        }
    }
    
}
